package com.augurit.common.base.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.springframework.context.ApplicationContext;
import org.springside.modules.utils.SpringContextHolder;

import com.augurit.common.sysconfig.service.ISysConfigService;
import com.augurit.common.system.service.org.IAcApplicationService;
import com.augurit.common.system.service.org.IAcServerService;
import com.augurit.common.system.service.org.IAtHomepageConfigService;
import com.augurit.common.system.util.WebContextUtils;

public class AosInitListener implements ServletContextListener {
	
	public void contextDestroyed(ServletContextEvent sce) {
	}

	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("正在初始化 AOS 平台，请稍候 ...... ");
		
		// Web上下文
		ServletContext servletContext = sce.getServletContext();
		
		// 检查并加载AOS平台相关初始化配置信息
		checkAndLoadAosInitConfig(servletContext);

		System.out.println("AOS 平台初始化完毕！");
	}
	
	/**
	 * 检查并加载AOS平台相关初始化配置信息
	 * @param servletContext
	 */
	public static void checkAndLoadAosInitConfig(ServletContext servletContext){
		
		// 加载Spring配置文件
		ApplicationContext applicationContext = SpringContextHolder.getApplicationContext();
		
		// 检查后台系统管理是否已经初始化
		boolean success = checkSystemInit(applicationContext, servletContext);
		
		if(success){
			
			// 加载AOS平台相关初始化配置信息
			loadAosInitConfig(servletContext, applicationContext);
		}
	}
	
	/**
	 * 加载AOS平台相关初始化配置信息
	 * @param servletContext
	 * @param applicationContext
	 */
	public static void loadAosInitConfig(ServletContext servletContext, ApplicationContext applicationContext){
		
		// 加载个性化配置信息
		loadSysConfig(servletContext, applicationContext);
		
		// 加载有效首页配置信息
		loadHomepageConfig(servletContext, applicationContext);

		// 加载WEB服务器列表信息
		loadAcServerList(servletContext, applicationContext);
		
		// 加载应用列表信息
		loadAcApplicationList(servletContext, applicationContext);
		
		// 建立数据字典全局缓存
		buildSysCodeBuffer(servletContext);
	}
	
	/**
	 * 检查后台系统管理是否已经初始化
	 * @param acRoleService
	 * @param servletContext
	 */
	private static boolean checkSystemInit(ApplicationContext applicationContext, ServletContext servletContext){
		System.out.println("正在检查后台系统管理是否已经初始化，请稍候 ...... ");
		
		//获取service
		ISysConfigService sysConfigService = (ISysConfigService) applicationContext.getBean("sysConfigServiceImpl");
		
		boolean success = WebContextUtils.checkSystemInit(sysConfigService, servletContext);
		
		if(success)
			System.out.println("后台系统管理已初始化！");
		else
			System.out.println("后台系统管理尚未初始化！");
		
		return success;
	}
	
	/**
	 * 加载个性化配置信息
	 * @param applicationContext
	 * @param servletContext
	 */
	private static void loadSysConfig(ServletContext servletContext, ApplicationContext applicationContext){
		System.out.println("正在加载个性化配置信息，请稍候 ...... ");
		
		//获取service
		ISysConfigService sysConfigService = (ISysConfigService) applicationContext.getBean("sysConfigServiceImpl");
		
		boolean success = WebContextUtils.syncSysConfig(sysConfigService, servletContext);
		
		if(success)
			System.out.println("加载个性化配置信息完毕！");
		else
			System.out.println("注意：无法获取任何个性化配置信息！");
	}
	
	/**
	 * 加载有效首页配置信息
	 * @param servletContext
	 * @param applicationContext
	 */
	public static void loadHomepageConfig(ServletContext servletContext, ApplicationContext applicationContext){
		System.out.println("正在加载指定的系统首页配置信息，请稍候 ...... ");
		
		//获取service
		IAtHomepageConfigService atHomepageConfigService = (IAtHomepageConfigService) applicationContext.getBean("atHomepageConfigServiceImpl");

		//同步更新系统首页配置信息的application变量名
		WebContextUtils.syncAtHomepageConfig(atHomepageConfigService, servletContext);
		
		System.out.println("系统首页配置信息加载完毕！");
	}
	
	/**
	 * 建立数据字典全局缓存（应用缓存或集群环境都适用）
	 * @param servletContext
	 */
	public static void buildSysCodeBuffer(ServletContext servletContext){
		if(!WebContextUtils.isCluster(servletContext)){
			System.out.println("正在建立数据字典全局缓存空间，请稍候 ...... ");
			WebContextUtils.buildSysCodeBuffer(servletContext);
			System.out.println("建立数据字典全局缓存空间完毕！");
		}
	}
	
	/**
	 * 加载WEB服务器列表信息（应用缓存或集群环境都适用）
	 * @param servletContext
	 * @param applicationContext
	 */
	public static void loadAcServerList(ServletContext servletContext, ApplicationContext applicationContext){
		if(!WebContextUtils.isCluster(servletContext)){
			System.out.println("正在加载WEB服务器列表信息，请稍候 ...... ");
			
			//获取service
			IAcServerService acServerService = (IAcServerService)applicationContext.getBean("acServerServiceImpl");
			
			//同步更新系统首页配置信息的application变量名
			boolean existAcServer = WebContextUtils.syncAcServer(acServerService, servletContext);
			
			if(existAcServer)
				System.out.println("WEB服务器列表信息加载完毕！");
			else
				System.out.println("注意：无法获取任何WEB服务器列表信息！");
		}
	}
	
	/**
	 * 加载应用列表信息（应用缓存或集群环境都适用）
	 * @param servletContext
	 * @param applicationContext
	 */
	public static void loadAcApplicationList(ServletContext servletContext, ApplicationContext applicationContext){
		if(!WebContextUtils.isCluster(servletContext)){
			System.out.println("正在加载应用列表信息，请稍候 ...... ");
			
			//获取service
			IAcApplicationService acApplicationService = (IAcApplicationService)applicationContext.getBean("acApplicationServiceImpl");
	
			//同步更新系统首页配置信息的application变量名
			boolean existAcApplication = WebContextUtils.syncAcApplication(acApplicationService, servletContext);
			
			if(existAcApplication)
				System.out.println("应用列表信息加载完毕！");
			else
				System.out.println("注意：无法获取任何应用列表信息！");
		}
	}
}